home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-01 / smailsrc.zip / SMAIL.ZIP / NPTX.C < prev    next >
Text File  |  1990-03-06  |  4KB  |  195 lines

  1. #ifndef lint
  2. static char *sccsid = "@(#)nptx.c    2.5 (smail) 9/15/87";
  3. #endif
  4.  
  5. #include <stdio.h>
  6. #include <sys/types.h>
  7. #include <sys/stat.h>
  8. #include <pwd.h>
  9. #include "defs.h"
  10. #include <ctype.h>
  11.  
  12. char *malloc(), *index(), *fullname();
  13. void nptx(), free(), dotspace();
  14.  
  15. enum edebug debug;    /* not used by nptx */
  16. char *fnlist = NULL;    /* not used by nptx */
  17.  
  18. main()
  19. {
  20.     int i;
  21.     char buf[SMLBUF], *p, *name, *last, *nick, *ctmp;
  22.  
  23.     while(gets(buf) != NULL) {
  24.         /*  line should be in form
  25.         **
  26.         **  login    First Last
  27.         ** or
  28.         **  login    First Last(Nickname)
  29.         **
  30.         */
  31.         if((p = index(buf, '\t')) == NULL) {
  32.             (void) fprintf(stderr, "format error: %s\n", buf);
  33.             continue;
  34.         }
  35.  
  36.         *p++ = '\0';
  37.         name = fullname(p);
  38.         dotspace(name);
  39.  
  40.         if (last = rindex(name, '.')) {
  41.             last++;
  42.         } else {
  43.             last = NULL;
  44.         }
  45.  
  46.         if ((nick = index(p, '(')) != NULL) {
  47.             nick++;
  48.             if ((ctmp = index(nick, ')')) == NULL) {
  49.                 nick = NULL;
  50.             } else {
  51.                 *ctmp = '\0';
  52.             }
  53.         }
  54.  
  55.         nptx(buf, name);
  56.  
  57.         if((last != NULL) && (nick != NULL)) {
  58.             i=strlen(nick) + strlen(last) + 2;
  59.             if((name = malloc(i)) != NULL) {
  60.                 (void) strcpy(name, nick);
  61.                 (void) strcat(name, ".");
  62.                 (void) strcat(name, last);
  63.                 dotspace(name);
  64.                 nptx(buf, name);
  65.                 free(name);
  66.             }
  67.         }
  68.     }
  69.     return(0);
  70. }
  71.  
  72. void
  73. dotspace(s)
  74. char *s;
  75. {
  76.     register char *p, *t;
  77.  
  78.     /* turn whitespace to '.' */
  79.     for(p = s; *p != '\0'; p++) {
  80.         if((*p == ' ') || (*p == '\t')) {
  81.             *p = '.';
  82.         }
  83.     }
  84.  
  85.     /* elide leading '.'s */
  86.     for(p = s; *p == '.' ; p++)
  87.         ;
  88.  
  89.     /* elide mulitple '.'s and all "'"s */
  90.     for(t = s; *p != '\0'; p++, t++) {
  91.         *t = *p;
  92.  
  93.         if(*t == '\'') {
  94.             t--;
  95.             continue;
  96.         }
  97.  
  98.         if(*p == '.') {
  99.             while(*(++p) == '.')
  100.                 ;
  101.             p--;
  102.         }
  103.     }
  104.     *t = '\0';
  105.  
  106.     /* elide trailing '.' */
  107.     if((t > s) && (*(--t) == '.')) *t = '\0';
  108. }
  109.  
  110. void
  111. nptx(login, name)
  112. char *login, *name;
  113. {
  114.     int i,j,k,N,lim,mask;
  115.     int ii,ji,ki,Ni,limi,maski;
  116.     char nl[11][100], il[11][100];
  117.     char *pi, *p, *rindex();
  118.     char buf[100];
  119.     char bufi[100];
  120.  
  121.     if((name == NULL) || (*name == '\0')) {
  122.         return;
  123.     }
  124.  
  125.     for(i=0; i < 10; i++) {
  126.         if((p = rindex(name, '.')) == NULL) break;
  127.         (void) strcpy(nl[i], p+1);
  128.         *p = NULL;
  129.     }
  130.     (void) strcpy(nl[i], name);
  131.  
  132.     while((strcmpic(nl[i], "Mr"  ) == 0)
  133.      ||   (strcmpic(nl[i], "Dr"  ) == 0)
  134.      ||   (strcmpic(nl[i], "Mrs" ) == 0)
  135.      ||   (strcmpic(nl[i], "Miss") == 0)
  136.      ||   (strcmpic(nl[i], "Ms"  ) == 0)) {
  137.         i--;
  138.     }
  139.  
  140.     while((strcmpic(nl[0], "Jr") == 0)
  141.      ||   (strcmpic(nl[0], "Sr") == 0)) {
  142.         for(j=0; j < i; j++) {
  143.             (void) strcpy(nl[j], nl[j+1]);
  144.         }
  145.         i--;
  146.     }
  147.  
  148.     N = i;
  149.     lim = 1 << (N+1);
  150.     for(mask = 1 << N ; mask < lim ; mask++) {
  151.         buf[0] = '\0';
  152.         for(j = 1, k = N; j < lim; j <<=1, k--) {
  153.             if(j & mask) {
  154.                 (void) strcat(buf, nl[k]);
  155.                 (void) strcat(buf, ".");
  156.             }
  157.         }
  158.         if((p = rindex(buf, '.')) != NULL) {
  159.             *p = '\0';
  160.         }
  161.  
  162.         for(ii=0; ii < 10; ii++) {
  163.             if((pi = rindex(buf, '.')) == NULL) break;
  164.             (void) strcpy(il[ii], pi+1);
  165.             *pi = NULL;
  166.         }
  167.         (void) strcpy(il[ii], buf);
  168.         Ni = ii;
  169.         limi = 1 << (Ni+1);
  170.         for(maski = 1 << Ni /* 0 */ ; maski < limi ; maski++) {
  171.             bufi[0] = '\0';
  172.             for(ji = 1, ki = Ni; ji < limi; ji <<=1, ki--) {
  173.                 if(ji & maski) {
  174.                     (void) strcat(bufi, il[ki]);
  175.                 } else {
  176.                     char init[3];
  177.                     init[0] = il[ki][0];
  178.                     init[1] = '\0';
  179.                     (void) strcat(bufi, init);
  180.                 }
  181.                 (void) strcat(bufi, ".");
  182.             }
  183.             if((pi = rindex(bufi, '.')) != NULL) {
  184.                 *pi = '\0';
  185.             }
  186. #ifdef DOT_REQD
  187.             if(index(bufi, '.') == NULL) {
  188.                 continue;
  189.             }
  190. #endif /* DOT_REQD */
  191.             (void) printf("%s\t%s\n",bufi, login); /* */
  192.         }
  193.     }
  194. }
  195.